package fr.syntheses.blog.controller;



import fr.syntheses.blog.Service.mailler.MailServices;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.Preparable;

import fr.syntheses.blog.DomainService.ServiceArticleHql;
import fr.syntheses.blog.DomainService.ServiceCategorieHql;
import fr.syntheses.blog.DomainService.ServiceDaoArticle;
import fr.syntheses.blog.DomainService.ServiceDaoCategorie;
import fr.syntheses.blog.DomainService.ServiceDaoStyle;
import fr.syntheses.blog.DomainService.ServiceDaoUtilisateur;
import fr.syntheses.blog.DomainService.ServiceStyleHql;
import fr.syntheses.blog.DomainService.ServiceUtilisateurHql;
import fr.syntheses.blog.DomainService.ServiceUtilisateurSql;
import fr.syntheses.blog.Model.DAO.HQL.UtilisateurDaoHib;
import fr.syntheses.blog.Model.DAO.SQL.ArticleDAO;
import fr.syntheses.blog.Model.DAO.SQL.CategorieDAO;
import fr.syntheses.blog.Model.DAO.SQL.CentredinteretsDAO;
import fr.syntheses.blog.Model.DAO.SQL.CommentaireDAO;
import fr.syntheses.blog.Model.DAO.SQL.FicheutilisateurDAO;
import fr.syntheses.blog.Model.DAO.SQL.StyleDAO;
import fr.syntheses.blog.Model.DAO.SQL.UtilisateurDAO;
import fr.syntheses.blog.beans.Article;
import fr.syntheses.blog.beans.Categorie;
import fr.syntheses.blog.beans.Centredinterets;
import fr.syntheses.blog.beans.Commentaire;
import fr.syntheses.blog.beans.Ficheutilisateur;
import fr.syntheses.blog.beans.Style;
import fr.syntheses.blog.beans.Utilisateur;
import fr.syntheses.blog.beans.Mail;
import java.io.File;
import java.io.PrintStream;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

public class ContentController extends ActionSupport
implements SessionAware, ServletRequestAware, Preparable
{
	private static final long serialVersionUID = 1L;
	private Utilisateur utilisateur;
	private Article article;
	private Style style;
	private Commentaire commentaire;
	private Ficheutilisateur ficheutilisateur;
	private List<Utilisateur> listeUtilisateur;
	private Mail mail;
	
	private List<Article> listeArticle;
	private List<Categorie> listeCategories;
	private List<Commentaire> listeCommentaire;
	private List<Centredinterets> listeCentredinterets;
	private List<Style>listeStyles;
	
	private UtilisateurDAO utilisateurDao = new UtilisateurDAO();
	private ArticleDAO articleDao = new ArticleDAO();
	private CommentaireDAO commentaireDao = new CommentaireDAO();
//	private CategorieDAO categorieDao = new CategorieDAO();
	private FicheutilisateurDAO ficheutilisateurDAO = new FicheutilisateurDAO();
	private CentredinteretsDAO centredinteretsDAO = new CentredinteretsDAO();
	private StyleDAO styleDao= new StyleDAO();
	
	/**
	 * on instancie le mod�le Mail
	 */

	MailServices serviceMail = new MailServices();
	
	// faible couplage en action :
	
	private ServiceDaoUtilisateur serviceDaoUtilisateur = new ServiceUtilisateurHql();
	
	private ServiceDaoArticle serviceDaoArticle = new ServiceArticleHql();
	
	private ServiceDaoCategorie serviceDaoCategorie = new ServiceCategorieHql();
	
	private ServiceDaoStyle serviceDaoStyle = new ServiceStyleHql();
	
	
	
	private Map<String, Object> session;
	private HttpServletRequest request;
	private File image;
	private String imageFileName;
	private String imageContentType;
	private String motdepasseControl;
	private Logger log = Logger.getLogger(ContentController.class);
	
	
	
//	public String  testCoucheHib() {
//		System.out.println("test couche hibernate !");
//		
//		
//		
//		// bloc utilisateur 
//		
//		listeUtilisateur  = serviceDaoUtilisateur.listerUtilisateur();
//		utilisateur = serviceDaoUtilisateur.getUtilisateur(1);
//	    //serviceDaoUtilisateur.saveUtilisateur(utilisateur);
//		//serviceDaoUtilisateur.deleteUtilisateur(utilisateur);
//		
//		// iiiiiiiiiiiiiiii
//		
//		Utilisateur ue = new Utilisateur();
//		ue.setLogin("admin");
//		ue.setMotdepasse("admin1");
//		
//        serviceDaoUtilisateur.identifie(ue); 
//        
//        if (serviceDaoUtilisateur.identifie(ue) != null) {
//        	
//        	System.out.println("============================================");
//        	System.out.println("==========SUCCESS LOGIN ! =======");
//        	System.out.println("============================================");
//        } else {
//        	
//        	System.err.println("==========================================");
//        	System.err.println("===========ERROR LOGIN !==================");
//        	System.err.println("==========================================");
//        }
//		
//		// bloc article
//		listeArticle = serviceDaoArticle.listerArticle();
//		
//		// lister Categorie
//		
//		listeCategories = serviceDaoCategorie.listerCategorie();
//		
//		// lister Style 
//		listeStyles = serviceDaoStyle.listerStyle();
//		
//		return SUCCESS;
//	}
	
	
	
	/**
	 * methode de Listage d'un article
	 * @return
	 */

	public String accueilBlog()
	{
		System.out.println("Entering in listerArticles() ");


		
		this.listeArticle = this.serviceDaoArticle.listerArticle();
		
		//Lister les categories
		setListeCategories(this.serviceDaoCategorie.listerCategorie());
		
		


		System.out.println("Exit listerArticles() with SUCCESS and listeArticle size =" + this.listeArticle.size());

		return SUCCESS;
	}

	

	/**
	 * @return la liste des utilisateurs.
	 */
	
	public String listutilisateur()
	{
		System.out.println("Entering in listerUtilisateur() ");

		listeUtilisateur = this.serviceDaoUtilisateur.listerUtilisateur();

		System.out.println("Exit listerUtilisateur () with SUCCESS and listeUtilisateur size =" + this.listeUtilisateur.size());

		return "success";
	}

	

	/**
	 * methode d'identification d'utilisateur
	 * @return un string SUCCESS ou ERROR
	 */
	
	public final String identifie()
	{
		if (this.serviceDaoUtilisateur.identifie(this.utilisateur) != null)
		{
			this.session.put("user", this.serviceDaoUtilisateur.identifie(this.utilisateur));
			addActionMessage("");
			return "success";
		}

		addActionMessage("Mauvais login ou mot de passe ! Veuillez recommencer !");
		return "error";
	}

	
	/**
	 * methode d'envoi de mail en cas de perte de mot de passe
	 * @return un string SUCCESS ou ERROR
	 */
	
	public String envoiMail() {
		log.info("Entering in envoiMailAction");
		// on r�cup�re les donn�es du formulaire

		// on récupère le mdp par le mail de l'utilisateur
		String mdp = serviceDaoUtilisateur.getMdpByMailAdress(mail.getMailAdress());
		
		String envoi = serviceMail.sendMail(mail.getMailAdress(), mdp);
		
		System.out.println("==========>" + envoi);
		
		
		if (envoi != "") {
			mail.setMailError(envoi);
			return ERROR;
		}
		
		
		log.info("Exit envoiMail");
		return SUCCESS;
	}
	/**
	 * methode d'ajout d'un article
	 * @return
	 */
	
	public String afficherFormArticle()
	{
		this.listeCategories = this.serviceDaoCategorie.listerCategorie();

		return "success";
	}

	public String createArticle()
	{
		System.out.println("Entering in createArticle () " + this.article);

		this.articleDao.createArticle(this.article);

		System.out.println("Exit articleDao() with SUCCESS");

		return "success";
	}
	
	/**
	 * methode de supression d'un article
	 * @return
	 */

	public final String supArticle()
	{
		this.log.info("entering in supArticle() sur  id = " + Integer.parseInt(this.request.getParameter("id")));

		int idArticle = Integer.parseInt(this.request.getParameter("id"));

		this.articleDao.delete(idArticle);

		this.log.info("exit supArticle() suppression is : = ");

		return "success";
	}

	
	/**
	 * methode de modification d'un article.
	 * @return String
	 */
	public String editer()
	{
		int id = Integer.parseInt(this.request.getParameter("id"));

		this.article = this.articleDao.editer(id);

		return "success";
	}

	public final String modifArticle()
	{
		this.log.info("entering in modifArticle() = ");

		ArticleDAO articleDAO = new ArticleDAO();
		articleDAO.update(this.article);

		System.err.println("okokok");

		this.log.info("exit modifArticle() suppression is : = ");

		return "success";
	}

	/**
	 * methode de suppression d'utilisateur.
	 * @return
	 */
	
	public final String supUtilisateur()
	{
		this.log.info("entering in supArticle() sur  id = " + Integer.parseInt(this.request.getParameter("id")));

		int idUtilisateur = Integer.parseInt(this.request.getParameter("id"));

		this.utilisateurDao.delete(idUtilisateur);

		this.log.info("exit supUtilisateur() suppression is : = ");

		return "success";
	}

	
	/**
	 * methode d'ajout d'utilisateur.
	 * @return
	 */
	public final String addutilisateur()
	{
		this.listeCentredinterets = this.centredinteretsDAO.listercentre();
		
		this.ficheutilisateurDAO.addfiche(this.ficheutilisateur);
		
		System.err.println("this.imageFileName"+this.imageFileName);
		
		if (this.imageFileName!=null)
		{
//--placer le nom de fichier dans utilisateur
		utilisateur.setImage(this.imageFileName);
	
	// copier le fichier dans le répertoire de l'application imagesUtilisateurs
		
		ServletContext context = ServletActionContext.getServletContext();
		
		String repertoireImagesUtilisateurs = context.getRealPath("img/imagesutilisateurs");
		
		File sauvegardeImage = new File(repertoireImagesUtilisateurs, this.imageFileName);
		
		

		
		this.image.renameTo(sauvegardeImage);
		}
		//UtilisateurDAO.addutilisateur(this.utilisateur);
		
		
		this.utilisateurDao.adduser(this.utilisateur, this.ficheutilisateurDAO.lastIdFichDao());
		

		return "success";
	}

	
	/**
	 * methode lister centre dinterets.
	 * @return
	 */
	public String listcentreinteret()
	{
		this.listeCentredinterets = this.centredinteretsDAO.listercentre();

		System.out.println("Exit listeCentredinterets () with SUCCESS and listeCentredinterets size =" + this.listeCentredinterets.size());
		return "success";
	}

	
	
	/**
	 * liste des style disponibles.
	 * @return le code erreur
	 */
	public String listerStyles() {
		listeStyles = styleDao.listStyle();

		if (listeStyles != null){
			return "SUCCESS";
		}
		else{
			return "ERROR";
		}
	}
	public void recupererArticlesDistant()
	{
	}

	public void listeCommentaires()
	{
	}

	public void publierCommentaire()
	{
	}

	public void modifierCommentaire()
	{
	}

	public void supprimerCommentaire()
	{
	}

	public void afficherArticle()
	{
	}

	public void paginerArticles()
	{
	}

	public void commenter()
	{
	}

	public void alerterCommentaire()
	{
	}

	public Utilisateur getUtilisateur()
	{
		return this.utilisateur;
	}

	public void setUtilisateur(Utilisateur utilisateur)
	{
		this.utilisateur = utilisateur;
	}

	public Article getArticle()
	{
		return this.article;
	}

	public void setArticle(Article article)
	{
		this.article = article;
	}

	public Commentaire getCommentaire()
	{
		return this.commentaire;
	}

	public void setCommentaire(Commentaire commentaire)
	{
		this.commentaire = commentaire;
	}

	public List<Utilisateur> getListeUtilisateur()
	{
		return this.listeUtilisateur;
	}

	public void setListeUtilisateur(List<Utilisateur> listeUtilisateur)
	{
		this.listeUtilisateur = listeUtilisateur;
	}

	public List<Article> getListeArticle()
	{
		return this.listeArticle;
	}

	public void setListeArticle(List<Article> listeArticle)
	{
		this.listeArticle = listeArticle;
	}

	public List<Commentaire> getListeCommentaire()
	{
		return this.listeCommentaire;
	}

	public void setListeCommentaire(List<Commentaire> listeCommentaire)
	{
		this.listeCommentaire = listeCommentaire;
	}

	public UtilisateurDAO getUtilisateurDao()
	{
		return this.utilisateurDao;
	}

	public void setUtilisateurDao(UtilisateurDAO utilisateurDao)
	{
		this.utilisateurDao = utilisateurDao;
	}

	public ArticleDAO getArticleDao()
	{
		return this.articleDao;
	}

	public void setArticleDao(ArticleDAO articleDao)
	{
		this.articleDao = articleDao;
	}

	public CommentaireDAO getCommentaireDao()
	{
		return this.commentaireDao;
	}

	public void setCommentaireDao(CommentaireDAO commentaireDao)
	{
		this.commentaireDao = commentaireDao;
	}

	public List<Categorie> getListeCategories()
	{
		return this.listeCategories;
	}

	public void setListeCategories(List<Categorie> listeCategories)
	{
		this.listeCategories = listeCategories;
	}

	public void setSession(Map<String, Object> session)
	{
		this.session = session;
	}

	public void setServletRequest(HttpServletRequest request)
	{
		this.request = request;
	}

	public void prepare()
			throws Exception
			{
		this.listeArticle = this.articleDao.listerArticles();
		setListeCategories(this.serviceDaoCategorie.listerCategorie());
		this.listeStyles=this.styleDao.listStyle();
			}

	public Ficheutilisateur getFicheutilisateur()
	{
		return this.ficheutilisateur;
	}

	public void setFicheutilisateur(Ficheutilisateur ficheutilisateur)
	{
		this.ficheutilisateur = ficheutilisateur;
	}

	public String getMotdepasseControl()
	{
		return this.motdepasseControl;
	}

	public void setMotdepasseControl(String motdepasseControl)
	{
		this.motdepasseControl = motdepasseControl;
	}

	public CentredinteretsDAO getCentredinteretsDAO()
	{
		return this.centredinteretsDAO;
	}

	public void setCentredinteretsDAO(CentredinteretsDAO centredinteretsDAO)
	{
		this.centredinteretsDAO = centredinteretsDAO;
	}

	public List<Centredinterets> getListeCentredinterets()
	{
		return this.listeCentredinterets;
	}

	public void setListeCentredinterets(List<Centredinterets> listeCentredinterets)
	{
		this.listeCentredinterets = listeCentredinterets;
	}

	public File getImage()
	{
		return this.image;
	}

	public void setImage(File image)
	{
		this.image = image;
	}

	public String getImageFileName()
	{
		return this.imageFileName;
	}

	public void setImageFileName(String imageFileName)
	{
		this.imageFileName = imageFileName;
	}

	public String getImageContentType()
	{
		return this.imageContentType;
	}

	public void setImageContentType(String imageContentType)
	{
		this.imageContentType = imageContentType;
	}



	public Style getStyle() {
		return style;
	}



	public void setStyle(Style style) {
		this.style = style;
	}



	public List<Style> getListeStyles() {
		return listeStyles;
	}



	public void setListeStyles(List<Style> listeStyles) {
		this.listeStyles = listeStyles;
	}



	/**
	 * @return the mail
	 */
	public Mail getMail() {
		return mail;
	}



	/**
	 * @param mail the mail to set
	 */
	public void setMail(Mail mail) {
		this.mail = mail;
	}
	
	
}